package Blog;

import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.*;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;

import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

import static java.lang.Thread.sleep;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogCases extends IniAndEnd{
    public static Stream<Arguments> Generator() {
        return Stream.of(
                Arguments.arguments("http://127.0.0.1:8080/blog_detail.html?blogId=11",
                        "博客详情页",
                        "自动化测试"));
    }
    // 登录测试用例
    /**
     * 输入正确的账号密码
     */
    @Order(1)
    @ParameterizedTest //通过参数化的方式来获取
//    @ValueSource(strings = {"zhangshan","123","http://127.0.0.1:8080/blog_list.html"})
    @CsvFileSource(resources = "LoginSuccess.csv")
    void LoginSuccess(String username, String password,String list_url) throws InterruptedException {
        // 打开博客登录页面
        webDriver.get("http://127.0.0.1:8080/blog_login.html");
        // sleep(3000);
        // 转换成智能等待
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 输入账号
       // webDriver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);


        // 输入密码
       // webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);


        // 点击提交按钮
        webDriver.findElement(By.cssSelector("#submit")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);


        // 点击提交之后， 页面跳转到列表页
        // 获取到当前页面的 url
        String url = webDriver.getCurrentUrl();
        // 如果对应的 url 等于对应的值 http://127.0.0.1:8080/blog_list.html 就是测试通过， 否则就是测试不通过
        Assertions.assertEquals(list_url,url); //用 断言进行比较
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);



        // 列表页展示的信息是 登录者的信息
        // 如果用户名展示的是 登录者信息那就测试通过， 否则就不通过
        String name = webDriver.findElement(By.cssSelector("body > div.container > div.left > div > h3")).getText();
        // getText(); 同过这个方法获取文本
        // By.cssSelector 里面传入的是 前端页面登陆者信息的h3标签的 CopySelector

        // 接下来进行对比
        Assertions.assertEquals(username,name);
    }

    // 校验博客列表页的数量
    @Order(2)
    @Test
    void BlogList() {
        // 打开博客列表页
        webDriver.get("http://127.0.0.1:8080/blog_list.html");
        // 获取页面上所有博客标题 对应的元素
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS); //加上 智能等待
        // 防止 还没有加载出来就去判断
        int title_num = webDriver.findElements(By.cssSelector(".title")).size();
        // 如果元素的数量不为零 ， 测试通过
        Assertions.assertNotEquals(0,title_num);

    }

    // 校验 查看详情页面
    //

    @Order(4)
    @ParameterizedTest
    @MethodSource("Generator")
    void BlogDetail(String expected_url, String expected_title,String expected_blog_title){
        // 先定位博客， 用 Xpath 来去定位就可以了
        // 找到第一篇对应博客查看全文的按钮
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/a")).click();
        // 来到了详情页
        // 获取当前页面的 url
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);

        String url = webDriver.getCurrentUrl();
        // 获取当前页面的 title
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);

        String title = webDriver.getTitle();
        // 获取博客详情页的标题
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);

         String blog_title = webDriver.findElement(By.cssSelector("body > div.container > div.right > div > div.title")).getText();
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);

        // Assertions.assertEquals(expected_url,url); //这里需要更改
         Assertions.assertEquals(expected_title,title);
         Assertions.assertEquals(expected_blog_title,blog_title);
         if(url.contains(expected_title)){
             System.out.println("测试通过");
         }else {
             System.out.println("测试不通过");
         }
    }

    // 测试写博客
    @Order(3 )
    @Test
    void EditBlog() throws InterruptedException {
        // 找到写博客按钮，点击
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        // 找到输入框，输入博客标题
        // 用js来输入
       // webDriver.findElement(By.cssSelector("#title"))
        ((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value=\"自动化测试\"");
        sleep(3000);
        // 点击发布
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(3000);

        // 进行校验
        // 获取当前页面 url （因为提交之后需要跳转页面）
        String url = webDriver.getCurrentUrl();
        Assertions.assertEquals("http://127.0.0.1:8080/blog_list.html",url);
    }
    /**
     *  校验已发布博客标题
     *  校验已发布博客的时间
     */
    @Order(5)
    @Test
    void BlogInfoChecked(){
        webDriver.get("http://127.0.0.1:8080/blog_list.html");
        // 获取第一篇博客标题
        String title = webDriver.findElement(By.cssSelector("body > div.container > div.right > div > div.title")).getText();
        // 获取第一篇博客的发布时间
        String time = webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]")).getText();
        // 判断
        // 校验博客标题是不是自动化测试
        Assertions.assertEquals("自动化测试",title);
        // 判断时间
        // 如果 时间是 2024-3-18号发布的就通过
        if(title.contains("2024-03-18")){
            System.out.println("测试通过");
        }else {
            System.out.println("当前时间： "+time);
            System.out.println("测试不通过");
        }
    }

    // 删除刚才发布的博客
    @Order(6)
    @Test
    void DeletBlog() throws InterruptedException {
        // 打开博客列表页
        webDriver.findElement(By.cssSelector("http://127.0.0.1:8080/blog_list.html"));
        // 点击查看全文按钮
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        webDriver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > a")).click();
        // 点击删除按钮
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);

        webDriver.findElement(By.cssSelector("body > div.container > div.right > div > div.operating > button:nth-child(2)")).click();
       // webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        sleep(3000);
        // 校验 博客列表页 第一篇博客标题不是自动化测试了
        String first_ttle = webDriver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > div.title")).getText();
        // 校验标题是否相等
        Assertions.assertNotEquals(first_ttle,"自动化测试");

    }


}
